"""
题目21：猴子吃桃问题：猴子第一天摘下若干个桃子，当即吃了一半，还不瘾，又多吃了一个第二天早上又将剩下的桃子吃掉一半，又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时，见只剩下一个桃子了。求第一天共摘了多少。

程序分析：采取逆向思维的方法，从后往前推断。
"""


import itertools


def timu21(n):
    final = 1
    sum = 0
    for i in range(n-1):
        # sum = sum + (final+1)*2
        final = (final+1)*2
    print(final)


# timu21(10)


"""
题目22：两个乒乓球队进行比赛，各出三人。甲队为a,b,c三人，乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比，c说他不和x,z比，请编程序找出三队赛手的名单。
"""

# 腾讯元宝生成的，本人没做，应该是迭代器方面的

# 定义甲队和乙队成员
team_a = ['a', 'b', 'c']
team_b = ['x', 'y', 'z']

# # 生成乙队所有可能的排列（即对手分配方案）
# for opponents in itertools.permutations(team_b):
#     # 将排列映射到甲队成员：a的对手是opponents[0]，b是opponents[1]，c是opponents[2]
#     if (opponents[0] != 'x') and (opponents[2] != 'x') and (opponents[2] != 'z'):
#         print(f"a vs {opponents[0]}, b vs {opponents[1]}, c vs {opponents[2]}")


"""
题目23：打印出如下图案（菱形）:
   *
  ***
 *****
*******
 *****
  ***
   *
"""


def timu23(hangshu):
    for i in range(1, hangshu, 2):
        space = "-" * ((hangshu-i)//2)
        xing = "*" * i
        print(space+xing)
    print("---------------------------")
    for i in range(hangshu, 0, -2):
        space = "-" * ((hangshu-i)//2)
        xing = "*" * i
        print(space+xing)


# timu23(7)

# AI 生成的必然生成菱形的，但不是限制的整体高度


def timu23_1(n):
    """打印一个高度为 2n-1 的菱形"""
    # 上半部分 (包括中间最宽的一行)
    for i in range(n):
        spaces = ' ' * (n - i - 1)  # 每行前面的空格数递减
        stars = '*' * (2 * i + 1)   # 每行星号数递增: 1, 3, 5...
        print(spaces + stars)

    # 下半部分
    for i in range(n-2, -1, -1):    # 从 n-2 递减到 0
        spaces = ' ' * (n - i - 1)  # 每行前面的空格数递增
        stars = '*' * (2 * i + 1)   # 每行星号数递减
        print(spaces + stars)


# 调用函数，参数为菱形上半部分的行数（包括中间行）
# timu23_1(7)


def timu23_2():
    # 设置菱形的高度（奇数）
    height = 5

    # 计算中间行位置
    mid = height // 2 + 1

    # 上半部分（包括中间行）
    for i in range(1, mid + 1):
        # 计算星号数量：1,3,5...
        stars = 2 * i - 1
        # 计算左侧空格数量（使星号居中）
        spaces = mid - i
        print(' ' * spaces + '*' * stars)

    # 下半部分
    for i in range(mid + 1, height + 1):
        # 计算星号数量（递减）
        stars = 2 * (height - i + 1) - 1
        # 计算左侧空格数量
        spaces = i - mid
        print(' ' * spaces + '*' * stars)


# timu23_2()


"""
题目24：有一分数序列：2/1，3/2，5/3，8/5，13/8，21/13...求出这个数列的前20项之和。
"""


def timu24():
    n = 20
    mu = 1
    zi = 2
    newlist = []
    newlist.append(zi/mu)
    for i in range(n-1):
        # 原始方式
        # c = zi
        # zi = zi+mu
        # mu = c
        # 赋值方式，这块儿易错，不好理解
        mu, zi = zi, mu+zi
        print("上面是{}下面是{}".format(zi, mu))
        newlist.append(zi/mu)
        print(newlist)
        print(sum(newlist))


# timu24()

"""
题目25：求1+2!+3!+...+20!的和。
"""


def timu25():
    new_list = []
    first_num = 1
    for i in range(1, 21):
        # 上个循环的值再乘以这个循环的新数，就是新数的阶乘
        first_num = first_num * i
        new_list.append(first_num)
        result = sum(new_list)
    print(result)


# timu25()

"""
题目26：利用递归方法求5!。
"""

# 自己写的，但是好像不算递归，而且反了，成了1*2*3*4*5


def timu26(n):
    shu = 1
    for i in range(1, n+1):
        shu *= i
    print(shu)


# timu26(5)

# 正经的递归，


def timu26_1(n):
    shu = 1
    # 这个地方的判定条件很重要，而且需要函数需要返回值，不然无法相乘
    if n - 1 > 0:
        shu = n * timu26_1(n-1)
        return shu
    else:
        return 1


# print(timu26_1(5))


"""
题目27：利用递归函数调用方式，将所输入的5个字符，以相反顺序打印出来。
"""


def timu27(new_str):
    print(new_str.pop(-1))
    if len(new_str) != 0:
        timu27(new_str)


new_list = ["a", "b", "c", "d", "e"]
# timu27(new_list)


"""
题目28：有5个人坐在一起，问第五个人多少岁？他说比第4个人大2岁。问第4个人岁数，他说比第3个人大2岁。问第三个人，又说比第2人大两岁。问第2个人，说比第一个人大两岁。最后问第一个人，他说是10岁。请问第五个人多大？
"""


def timu28(n):
    if n == 1:
        return 10
    else:
        return timu28(n-1)+2


# print(timu28(5))


"""
题目29：给一个不多于5位的正整数，要求：一、求它是几位数，二、逆序打印出各位数字。
"""

# 这算是纯字符串转换法，还有列表、和通过数学计算除10等


def timu29(n):
    n_new = str(n)
    print("长度：", len(n_new))
    # for i in range(len(n_new), 0, -1):
    #     print(i)
    print(n_new[::-1])


# timu29(1234)


"""
题目30：一个5位数，判断它是不是回文数。即12321是回文数，个位与万位相同，十位与千位相同。
"""


def timu30(num):
    num_str = str(num)
    if num_str == num_str[::-1]:
        print("{}是回文数".format(num))
    else:
        print("{}不是回文数".format(num))


# timu30(123421)

# 这种虽然是体现数学计算了，但是位数也被限制了
def timu30_1(num):
    num = int(num)
    wu = num//10000
    si = (num//1000) % 10
    er = (num % 100)//10
    yi = num % 10
    if wu == yi and si == er:
        print("{}是回文数".format(num))
    else:
        print("{}不是回文数".format(num))


timu30_1(11221)
